from frame.ConstructionDataProcessor import ConstructionDataProcessor
import os
import os
import yaml
from ProjectEditor import ProjectEditor
import queue
from threading import Thread

class YAMLUpdaterWithOutput:
    YAML_template = "管节基础安装"
    def __init__(self, filepath, output_dir="output/分组yaml"):
        """
        :param filepath: 原始 YAML 文件路径
        :param output_dir: 输出目录
        """
        self.filepath = filepath
        self.output_dir = output_dir
        os.makedirs(self.output_dir, exist_ok=True)
        self.results = {}  # 存储处理结果 {group_name: data_dict}

    def process_group(self, group_keys, group_df):
        """
        处理单个分组数据并更新 YAML 内容
        :param group_keys: 分组键 (轴线, 类型)
        :param group_df: 当前分组的数据
        """
        基础_df = group_df[group_df["施工部位"].astype(str).str.contains("基础")]
        护壁_df = group_df[group_df["施工部位"].astype(str).str.contains("护壁")]

        if 基础_df.empty or 护壁_df.empty:
            return None

        editor = ProjectEditor(self.filepath)
        施工部位 = f"{group_keys[0]}{group_keys[1]}"
        涵底标高 = float(基础_df["涵底中心标高"].iloc[0])
        实际涵长 = float(基础_df["实际涵长"].iloc[0])

        设计坐标 = [
            float(group_df["坐标N(X)"].iloc[0]),
            float(group_df["坐标E(Y)"].iloc[0])
        ]

        # 1. 修改各模块施工部位
        
        editor.update_or_add_instance("JS103", "基础底", "施工部位", f"{施工部位}  基础底")
        editor.update_or_add_instance("JS103", "基础顶", "施工部位", f"{施工部位}  基础顶")
        editor.update_or_add_instance("JS103", "顶面", "施工部位", f"{施工部位}  顶面")
        
        editor.update_or_add_instance("JS111", "基础", "施工部位", f"{施工部位}  基础")
        editor.update_or_add_instance("JS111", "护壁", "施工部位", f"{施工部位}  护壁")
        
        editor.update_or_add_instance("JS601_1", "基础", "施工部位", f"{施工部位}  基础")
        editor.update_or_add_instance("JS601_1", "护壁", "施工部位", f"{施工部位}  护壁")
        
        
        editor.update_or_add_instance("GL105", "总体", "工程地点及桩号", 施工部位)


        # 2. JS103 设计高程
        editor.update_or_add_instance("JS103", "基础底", "设计高程", 涵底标高)
        editor.update_or_add_instance("JS103", "基础顶", "设计高程", 涵底标高 + 0.03)
        editor.update_or_add_instance("JS103", "顶面", "设计高程", 涵底标高 + 0.075)

        # 3. JS107 基础顶标高
        editor.update_or_add_instance("JS107", "基础", "基础顶高程", 涵底标高 + 0.03)
        editor.update_or_add_instance("JS107", "混凝土涵管安装", "基础顶高程", 涵底标高 + 0.075)

        # 4. JS111 断面尺寸长度设计值
        editor.update_or_add_instance("JS111", "基础", "断面尺寸长度设计值", 实际涵长)
        editor.update_or_add_instance("JS111", "护壁", "断面尺寸长度设计值", 实际涵长)
        
        
        # 5. 更新全局字段 - 设计坐标
        editor.update_global_field("设计坐标(X,Y)", 设计坐标)
        editor.update_global_field("施工部位", 施工部位)

        # 6. 获取当前项目数据并保存
        updated_data = editor.get_project_data()
        group_name = f"{group_keys[0]}_{group_keys[1]}"
        output_path = os.path.join(self.output_dir, f"项目基本信息_{group_name}.yaml")
        editor.save_to(output_path)

        # 存入结果字典
        self.results[group_name] = updated_data

        print(f"✅ 已生成 YAML 文件: {output_path}")
        return updated_data

    def run(self, filtered_df):
        """
        主运行函数
        :param filtered_df: 过滤后的 DataFrame 数据
        :return: dict - 所有处理后的 YAML 数据 {group_name: data_dict}
        """
        groups = list(filtered_df.groupby(["轴线", "类型"]))
        for group_keys, group_df in groups:
            self.process_group(group_keys, group_df)
        return self.results

class YAMLUpdaterWithOutput_baziqiang:
    
    YAML_tmplate = "八字墙"
    def __init__(self, filepath, output_dir="output/分组yaml"):
        """
        :param filepath: 原始 YAML 文件路径
        :param output_dir: 输出目录
        """
        self.filepath = filepath
        self.output_dir = output_dir
        os.makedirs(self.output_dir, exist_ok=True)
        self.results = {}  # 存储处理结果 {group_name: data_dict}

    def process_group(self, group_keys, group_df):
        """
        处理单个分组数据并更新 YAML 内容
        :param group_keys: 分组键 (轴线, 类型)
        :param group_df: 当前分组的数据
        """
        八字墙基础_df = group_df[group_df["施工部位"].astype(str).str.contains("八字墙基础")]
        八字墙墙身_df = group_df[group_df["施工部位"].astype(str).str.contains("八字墙墙身")]

        if 八字墙基础_df.empty or 八字墙墙身_df.empty:
            return None

        editor = ProjectEditor(self.filepath)
        施工部位 = f"{group_keys[0]}{group_keys[1]}"
        涵底标高 = float(八字墙基础_df["涵底中心标高"].iloc[0])
        实际涵长 = float(八字墙墙身_df["实际涵长"].iloc[0])

        设计坐标 = [
            float(group_df["坐标N(X)"].iloc[0]),
            float(group_df["坐标E(Y)"].iloc[0])
        ]

        # 1. 修改各模块施工部位
        
        editor.update_or_add_instance("JS103", "八字墙基础底", "施工部位", f"{施工部位}  八字墙基础底")
        editor.update_or_add_instance("JS103", "八字墙基础顶", "施工部位", f"{施工部位}  八字墙基础顶")
        editor.update_or_add_instance("JS103", "八字墙墙顶", "施工部位", f"{施工部位}  八字墙墙顶")
        
        editor.update_or_add_instance("JS111", "八字墙基础", "施工部位", f"{施工部位}  八字墙基础")
        editor.update_or_add_instance("JS111", "八字墙墙身", "施工部位", f"{施工部位}  八字墙墙身")
        
        editor.update_or_add_instance("JS601_1", "八字墙基础", "施工部位", f"{施工部位}  八字墙基础")
        editor.update_or_add_instance("JS601_1", "八字墙墙身", "施工部位", f"{施工部位}  八字墙墙身")
        
        
        editor.update_or_add_instance("GL105", "总体", "工程地点及桩号", 施工部位)


        # 2. JS103 设计高程
        editor.update_or_add_instance("JS103", "八字墙基础底", "设计高程", 涵底标高)
        editor.update_or_add_instance("JS103", "八字墙基础顶", "设计高程", 涵底标高 + 0.03)
        editor.update_or_add_instance("JS103", "八字墙墙顶", "设计高程", 涵底标高 + 0.075)

        # 3. JS107 基础顶标高
        editor.update_or_add_instance("JS107", "八字墙", "基础顶高程", 涵底标高 + 0.03)
        

        # 4. JS111 断面尺寸长度设计值
        editor.update_or_add_instance("JS111", "八字墙基础", "断面尺寸长度设计值", 实际涵长)
        editor.update_or_add_instance("JS111", "八字墙墙身", "断面尺寸长度设计值", 实际涵长)
        
        
        # 5. 更新全局字段 - 设计坐标
        editor.update_global_field("设计坐标(X,Y)", 设计坐标)
        editor.update_global_field("施工部位", 施工部位)

        # 6. 获取当前项目数据并保存
        updated_data = editor.get_project_data()
        group_name = f"{group_keys[0]}_{group_keys[1]}"
        output_path = os.path.join(self.output_dir, f"项目基本信息_{group_name}.yaml")
        editor.save_to(output_path)

        # 存入结果字典
        self.results[group_name] = updated_data

        print(f"✅ 已生成 YAML 文件: {output_path}")
        return updated_data

    def run(self, filtered_df):
        """
        主运行函数
        :param filtered_df: 过滤后的 DataFrame 数据
        :return: dict - 所有处理后的 YAML 数据 {group_name: data_dict}
        """
        groups = list(filtered_df.groupby(["轴线", "类型"]))
        for group_keys, group_df in groups:
            self.process_group(group_keys, group_df)
        return self.results


if __name__ == "__main__":
    # Step 1: 获取原始数据
    processor = ConstructionDataProcessor()
    final_df = processor.process()

    # Step 2: 清洗和过滤数据
    filtered_df = final_df.dropna(how='any')
    filtered_data = filtered_df[filtered_df['类型'] == '圆管涵']

    # Step 3: 启动 YAML 更新器
    updater = YAMLUpdaterWithOutput(
        filepath=r"/Users/chenhongbin/myapp1/highway-information/圆管涵/项目基本信息.yaml",
        output_dir="output/分组yaml"
    )

    all_processed_data = updater.run(filtered_data)

    # Step 4: 查看输出结果
    # print(all_processed_data.keys())  # 所有 group 名称
    first_group_data = next(iter(all_processed_data.values()))  # 取第一个
    print(first_group_data)  # 打印处理后的 YAML 数据